package p2pproxy;

import nfwx.analytics.BuildConfig;
import p2psvideo.Interfaces;

public class P2PSManager
{
	public static final int evMgrCose = 0;  ///< 管理器关闭
	public static final int evFileOpen = 1; ///< 文件打开		
	public static final int evFileClose =2; ///< 文件关闭
	public static final int evFileCreatePlayOK = 3; ///< 播放视频文件成功
	public static final int evFilePlayHeadChanged = 4; ///< 播放头发生变化
	public static final int evFileCreatePlayFailed = 5; ///< 播放视频文件失败	
	public static final int evFileCreateDownloadOK = 6; ///< 成功创建了下载
	public static final int evFileCreateDownloadFailed = 7; ///< 创建下载失败
	public static final int evFileListChanged = 8; ///< 文件列表发生变化
	public static final int evFileDownloadProgress = 9; ///< 下载进度发生变化
	public static final int evFileDownloadFinished = 10; ///< 文件下载完成
	
	///事件信息
	public static class P2PSMgrEventInfo
	{
		///事件类型
		public int eventCode;
		///子流ID
		public String vsid;
		///事件ID
		public String eventId;
	}
	private long _handle;
	/*!
	@brief 初始化p2psr管理器
	@param opts 初始化选项JSON格式
		- max_p2p_pull_requests 能接受的最大并发p2p拉取文件数，默认256
		- max_p2p_files 最大激活p2p的视频数, 默认32
		- allow_p2p 是否允许p2p, 默认为true
	*/
	public native boolean open(String opts);
	///关闭p2p管理器
	public native void close();
	///是否允许p2p
	public native void setAllowP2P(boolean allow);
	/*!
	@brief 判定文件是否存在
	*/
	public native boolean existsFile(String vsid);

	/*!
	@brief 移除文件
	*/
	public native boolean removeFile(String vsid);
	
	/*!
	@brief 获取文件列表
	@return 文件列表 JSON格式{ "files": [{"vsid": 文件的子流ID, "forPlay": 是否正在播放中, "forDownload": 是否正在下载, "percent": 下载比例,  "extra": 打开视频时跟视频相关的附加信息, "useTime": 最后一次使用时间s (从1970.1.1开始的时间戳), "root": 文件的缓存目录, "onDiskSize": 在磁盘中的空间大小}, ...] }
	*/
	public native String getFiles();
	
	/*!
	 @brief 获取文件信息
	 @return 如果失败返回null, 成功返回字符串，JSON格式 {"vsid": 子流ID, "vid": 视频ID, "live": 是否是直播, "forPlay": 是否正在播放, 
	 "forDownlod": 是否正在下载, "useTime": 最后一次使用时间s (从1970.1.1开始的时间戳), "root": 缓存目录, "onDiskSize": 在磁盘上的大小(字节),
	 "extra": 应用传递的附加数据, "downloadPolicy": 下载策略, "percent": 下载百分比
	 }
	 */
	public native String getFileInfo(String vsid);
	
	/*!
	@brief 获取Cache目录列表
	@return 目录列表, JSON格式 {"roots": [{"root": 缓存目录, "freeSpace": 空闲字节数}, ...]}
	*/
	public native String getCacheRoots();
	
	///移除缓存文件夹, 移除了缓存文件夹后， 属于该缓存文件夹的视频会被强制关闭, 如果removeVideo 为true则连视频文件也执行移除操作
	public native boolean removeCacheRoot(String root, boolean removeVideo);
	///添加缓存文件夹
	public native boolean addCacheRoot(String root, boolean resetP2P);
	///缓存空间是否太小了
	public native boolean cacheSpaceTooSmall();
	
	/*!
	@breif 设置最大同时下载数量
	@param maxDownloads 最大下载数量 1-16, 超出的范围的值忽略
	*/
	public native void setMaxDownload(int maxDownloads);
	///获取当前最大下载数
	public native int getMaxDownloads();
	///是否允许下载
	public native void allowDownload(boolean allow);
	/*!
	@brief 创建下载
	@param urls 媒体URL
	@param streamers 串流服务器地址，通常是rtmfp协议地址
	@param opts 选项
			vsid [可选] 要下载的子流ID，16进制，32个字符, 如果不设置则自动挑选一个子流进行下载
			video_codecs [可选] 设置播放器支持的视频解码器列表，如果不设置则默认为h.264
			event_id 事件通知ID
	@param type 下载策略
	@param format 媒体文件格式
	@return 如果返回false 表示下载创建失败, 返回true则表示下载任务已经提交在后台处理，是否成功不确定
	*/
	public native boolean createDownload(String urls, String streamers, String opts, int type, int format);
	/*!
	@brief 对已经创建的下载执行下载类型修改（取消，暂停，普通下载，尽快下载）
	@param vsid 子流ID 16进制，32个字符
	@param type 下载类型 
	@param downloadImd 是否立即下载
	@param eventId 事件通知ID
	@return 如果返回false表示vsid不存在，true 表示已经修改了下载类型
	*/
	public native boolean setDownloadType(String vsid, int type, boolean downloadImd, String eventId);
	
	///派发事件
	public native void dispatchEvent(int evcode, String vsid, String eventId);		
	///启用或者关闭事件缓存队列，缓存队列最多存放1024个事件，需要调用pullEvent及时拉取
	public native void enableEventsQueue(boolean enable);
	///拉取一个事件
	public	native boolean pullEvent(P2PSMgrEventInfo eventInfo);
	
	/*!
	 * @brief 读取http,或者rtmfpget协议的文件，如果两个url均设置则两个同时读取先响应者优先
	 */
	public native void readHttpRtmfpFile(String httpUrls, String rtmfpUrls, String filePath, Interfaces.OnHttpResponse cb);
	
	/*!
	 * @brief 获取本地代理端口
	 */
	public native int getProxyPort();
	
	/*!
	 * @brief 获取音频输出延迟, 返回值ms, 返回-1失败
	 */
	public static native int getAudioOutputLatency(int streamType);
	
	static {
		try {
			//System.loadLibrary("p2psclient");
			System.loadLibrary(BuildConfig.SO_LIB);
		} catch(Error e) {
			e.printStackTrace();
		}
	}	
}